target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@main.arr = private unnamed_addr constant [10 x i32] [i32 5, i32 4, i32 2, i32 7, i32 0, i32 6, i32 1, i32 3, i32 8, i32 9], align 16

define void @swap(i32* %a, i32* %b) nounwind uwtable {
  %1 = alloca i32*, align 8
  %2 = alloca i32*, align 8
  store i32* %a, i32** %1, align 8
  store i32* %b, i32** %2, align 8
  %tmp = alloca i32, align 4
  %3 = load i32** %1, align 8
  %4 = load i32* %3
  store i32 %4, i32* %tmp, align 4
  %5 = load i32** %2, align 8
  %6 = load i32* %5
  %7 = load i32** %1, align 8
  store i32 %6, i32* %7
  %8 = load i32* %tmp, align 4
  %9 = load i32** %2, align 8
  store i32 %8, i32* %9
  ret void
}

define i32 @partition(i32* %array, i32 %left, i32 %right, i32 %pivotIndex) nounwind uwtable {
  %1 = alloca i32*, align 8
  %2 = alloca i32, align 4
  %3 = alloca i32, align 4
  %4 = alloca i32, align 4
  %pivotValue = alloca i32, align 4
  %storeIndex = alloca i32, align 4
  %i = alloca i32, align 4
  store i32* %array, i32** %1, align 8
  store i32 %left, i32* %2, align 4
  store i32 %right, i32* %3, align 4
  store i32 %pivotIndex, i32* %4, align 4
  %5 = load i32* %4, align 4
  %6 = sext i32 %5 to i64
  %7 = load i32** %1, align 8
  %8 = getelementptr inbounds i32* %7, i64 %6
  %9 = load i32* %8
  store i32 %9, i32* %pivotValue, align 4
  %10 = load i32* %4, align 4
  %11 = sext i32 %10 to i64
  %12 = load i32** %1, align 8
  %13 = getelementptr inbounds i32* %12, i64 %11
  %14 = load i32* %3, align 4
  %15 = sext i32 %14 to i64
  %16 = load i32** %1, align 8
  %17 = getelementptr inbounds i32* %16, i64 %15
  call void @swap(i32* %13, i32* %17)
  %18 = load i32* %2, align 4
  store i32 %18, i32* %storeIndex, align 4
  %19 = load i32* %2, align 4
  store i32 %19, i32* %i, align 4
  br label %20

; <label>:20                                      ; preds = %44, %0
  %21 = load i32* %i, align 4
  %22 = load i32* %3, align 4
  %23 = icmp slt i32 %21, %22
  br i1 %23, label %24, label %47

; <label>:24                                      ; preds = %20
  %25 = load i32* %i, align 4
  %26 = sext i32 %25 to i64
  %27 = load i32** %1, align 8
  %28 = getelementptr inbounds i32* %27, i64 %26
  %29 = load i32* %28
  %30 = load i32* %pivotValue, align 4
  %31 = icmp slt i32 %29, %30
  br i1 %31, label %32, label %43

; <label>:32                                      ; preds = %24
  %33 = load i32* %storeIndex, align 4
  %34 = sext i32 %33 to i64
  %35 = load i32** %1, align 8
  %36 = getelementptr inbounds i32* %35, i64 %34
  %37 = load i32* %i, align 4
  %38 = sext i32 %37 to i64
  %39 = load i32** %1, align 8
  %40 = getelementptr inbounds i32* %39, i64 %38
  call void @swap(i32* %36, i32* %40)
  %41 = load i32* %storeIndex, align 4
  %42 = add nsw i32 %41, 1
  store i32 %42, i32* %storeIndex, align 4
  br label %43

; <label>:43                                      ; preds = %32, %24
  br label %44

; <label>:44                                      ; preds = %43
  %45 = load i32* %i, align 4
  %46 = add nsw i32 %45, 1
  store i32 %46, i32* %i, align 4
  br label %20

; <label>:47                                      ; preds = %20
  %48 = load i32* %3, align 4
  %49 = sext i32 %48 to i64
  %50 = load i32** %1, align 8
  %51 = getelementptr inbounds i32* %50, i64 %49
  %52 = load i32* %storeIndex, align 4
  %53 = sext i32 %52 to i64
  %54 = load i32** %1, align 8
  %55 = getelementptr inbounds i32* %54, i64 %53
  call void @swap(i32* %51, i32* %55)
  %56 = load i32* %storeIndex, align 4
  ret i32 %56
}

define void @qsort(i32* %array, i32 %left, i32 %right) nounwind uwtable {
  %1 = alloca i32*, align 8
  %2 = alloca i32, align 4
  %3 = alloca i32, align 4
  %pivotNewIndex = alloca i32, align 4
  store i32* %array, i32** %1, align 8
  store i32 %left, i32* %2, align 4
  store i32 %right, i32* %3, align 4
  %4 = load i32* %3, align 4
  %5 = load i32* %2, align 4
  %6 = icmp sgt i32 %4, %5
  br i1 %6, label %7, label %21

; <label>:7                                       ; preds = %0
  %8 = load i32** %1, align 8
  %9 = load i32* %2, align 4
  %10 = load i32* %3, align 4
  %11 = load i32* %2, align 4
  %12 = call i32 @partition(i32* %8, i32 %9, i32 %10, i32 %11)
  store i32 %12, i32* %pivotNewIndex, align 4
  %13 = load i32** %1, align 8
  %14 = load i32* %2, align 4
  %15 = load i32* %pivotNewIndex, align 4
  %16 = sub nsw i32 %15, 1
  call void @qsort(i32* %13, i32 %14, i32 %16)
  %17 = load i32** %1, align 8
  %18 = load i32* %pivotNewIndex, align 4
  %19 = add nsw i32 %18, 1
  %20 = load i32* %3, align 4
  call void @qsort(i32* %17, i32 %19, i32 %20)
  br label %21

; <label>:21                                      ; preds = %7, %0
  ret void
}

define void @sort(i32* %array, i32 %len) nounwind uwtable {
  %1 = alloca i32*, align 8
  %2 = alloca i32, align 4
  store i32* %array, i32** %1, align 8
  store i32 %len, i32* %2, align 4
  %3 = load i32** %1, align 8
  %4 = load i32* %2, align 4
  %5 = sub nsw i32 %4, 1
  call void @qsort(i32* %3, i32 0, i32 %5)
  ret void
}

define i32 @ordered(i32* %array, i32 %len) nounwind uwtable {
  %1 = alloca i32, align 4
  %2 = alloca i32*, align 8
  %3 = alloca i32, align 4
  %i = alloca i32, align 4
  store i32* %array, i32** %2, align 8
  store i32 %len, i32* %3, align 4
  store i32 1, i32* %i, align 4
  br label %4

; <label>:4                                       ; preds = %23, %0
  %5 = load i32* %i, align 4
  %6 = load i32* %3, align 4
  %7 = icmp slt i32 %5, %6
  br i1 %7, label %8, label %26

; <label>:8                                       ; preds = %4
  %9 = load i32* %i, align 4
  %10 = sub nsw i32 %9, 1
  %11 = sext i32 %10 to i64
  %12 = load i32** %2, align 8
  %13 = getelementptr inbounds i32* %12, i64 %11
  %14 = load i32* %13
  %15 = load i32* %i, align 4
  %16 = sext i32 %15 to i64
  %17 = load i32** %2, align 8
  %18 = getelementptr inbounds i32* %17, i64 %16
  %19 = load i32* %18
  %20 = icmp sgt i32 %14, %19
  br i1 %20, label %21, label %22

; <label>:21                                      ; preds = %8
  store i32 0, i32* %1
  br label %27

; <label>:22                                      ; preds = %8
  br label %23

; <label>:23                                      ; preds = %22
  %24 = load i32* %i, align 4
  %25 = add nsw i32 %24, 1
  store i32 %25, i32* %i, align 4
  br label %4

; <label>:26                                      ; preds = %4
  store i32 -1, i32* %1
  br label %27

; <label>:27                                      ; preds = %26, %21
  %28 = load i32* %1
  ret i32 %28
}

define i32 @main() nounwind uwtable {
  %1 = alloca i32, align 4
  %arr = alloca [10 x i32], align 16
  store i32 0, i32* %1
  %2 = bitcast [10 x i32]* %arr to i8*
  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %2, i8* bitcast ([10 x i32]* @main.arr to i8*), i64 40, i32 16, i1 false)
  %3 = getelementptr inbounds [10 x i32]* %arr, i32 0, i32 0
  %4 = call i32 @ordered(i32* %3, i32 10)
  %5 = icmp ne i32 %4, 0
  br i1 %5, label %6, label %7

; <label>:6                                       ; preds = %0
  store i32 1, i32* %1
  br label %14

; <label>:7                                       ; preds = %0
  %8 = getelementptr inbounds [10 x i32]* %arr, i32 0, i32 0
  call void @sort(i32* %8, i32 10)
  %9 = getelementptr inbounds [10 x i32]* %arr, i32 0, i32 0
  %10 = call i32 @ordered(i32* %9, i32 10)
  %11 = icmp ne i32 %10, 0
  br i1 %11, label %13, label %12

; <label>:12                                      ; preds = %7
  store i32 1, i32* %1
  br label %14

; <label>:13                                      ; preds = %7
  store i32 0, i32* %1
  br label %14

; <label>:14                                      ; preds = %13, %12, %6
  %15 = load i32* %1
  ret i32 %15
}

declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind